package cn.flying.base.process.listener.chain;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;

/**
 * @description: 调用链
 * @author: lvyong
 * @date: 2023年02月27日 13:56
 * @version: 1.0
 */
public class HandlerChain {

    private List<AbstractHandler> chain = new ArrayList<>(200);

    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        //从容器中获取接口（抽象类）类型的所有的实现类
        Map<String, AbstractHandler> beans = applicationContext.getBeansOfType(AbstractHandler.class);
        //将所有的实现类bean放入chain调用链中
        chain.addAll(beans.values());
    }

    public void handler(HandleContext context) {
        if (context.getPos() < chain.size()) {
            AbstractHandler handler = chain.get(context.getPos());
            // 移动位于处理器链中的位置
            context.setPos(context.getPos() + 1);
            //调用下一个
            handler.handle(context, this);
        }
    }
}
